package com.example.demo.juc;

/**
 * 谈谈Synchronizes和ReenTranLock的区别
 *
 * 可重入锁:指的是自己可以再次获得自己的内部锁,比如一个线程获得了某个对象的锁,此时这个
 * 对象还没有释放,当其再次
 * 想要获取这个对象的锁的时候,还是可以获取的,如果不可锁重入的话,就会造成死锁.同一个线程每次获取锁,锁的计数器都是自增1
 * ,所以要等到锁的计数器下降为0的时候才能释放
 *
 *
 * synchronized依赖于jvm而ReenTranLock依赖于Api
 *  synchronized是依赖于jvm实现的,前面我们讲到了虚拟机团队在jdk1.6为Synchronized关键字进行了很多优化,
 *  但是这些优化都是在虚拟机层面实现的,并没有直接暴露给我们,ReenTrantLock是jdk层面实现的,也就是Api,层面,和UnLock()方法配合Try/finally语句来完成
 *  所以我们可以通过查看他的源代码,来看他是如何实现的.
 *
 *  1.5.3ReenTrantLock比synchronized增加了哪一些高级的功能
 *  相比较synchronized,ReenTrantLock增加了一些高级的功能,主要有三点.
 *
 *    01:等待可中断:ReentrantLock提供了一种能够中断等待的线程的机制,通过Lock.lockInterrupptibly()来实现这个机制,也就是说整在等待的线程
 *    可以选择放弃,等待,改为其他处理,
 *    02:可实现公平锁:可以指定是公平锁还是非公平锁,而Synchronized只能是非公平锁,所谓的公平锁就是等待的线程先获得锁,ReenTrantLock默认情况是公平的,可以通过ReetTrantLoock之类的
 *    ReentTrantLock(Boolean fair)构造方法来指定是否是公平的.
 *    03:可实现选择性通知(锁可以绑定多个条件),synchronized关键字与wait()和notify()/notifyAll()方法想结合/等待机制,ReentTrantLock类当然也可以实现,但是需要
 *    借助于Condition接口与newCondition()方法
 *
 *    Condition是jdk1.5之后才有,它具有很好的灵活性,比如可以实现多路童年估值功能也就是在一个Lock对象中
 *    可以创建多个Condition实例(即对象监视器),线程对象可以注册在指定的condition中,从而可以有选择的进行通知,在调用线程上更加灵活,在使用Notify()
 *    /notifyAll()方法进行通知时,被通知线程时由jvm选择的,用reenTranLock类结合Condition实现可以实现,选择性通知"这个功能非常重要,
 *    而且是Conditiion接口提供了,而Synchronized关键字就是相当于整个Lock对象中只有一个condition实例,所有的线程注册都在一个身上,如果使用
 *    如果执行notifyAll()方法的话就会通知所有处理等待状态的线程这样会造成很大的问题,而Condition实例signalAll()fangfa
 *    只会唤醒注册该condition实例中的所有的等待线程.
 *
 */
public class Test05 {
}
